/*
*************************************************************************************************
*
*	文件名:	TouchScreen.c
* 	作	者:	王钰
* 	版	本:	1.0
* 	日	期:	2022-02-19
* 	说	明:	这是触摸屏驱动程序的文件。统一不同触摸芯片读取，并将坐标结果放入FIFO缓存区中
*
*	修改记录:
*		版本号	日期			作者            说明
*       V1.0    2022-02-19   	王钰    		初始版本
*
*	Copyright (C), 2022-2030, 王钰
*
**************************************************************************************************
*/
#include "TouchScreen.h"

#if ENABLE_TOUCH

#if(TOUCH_TYPE == TOUCH_HY4633)
	#include "hy4633.h"
#elif(TOUCH_TYPE == TOUCH_FT5336)
	#include "ft5336.h"
#elif(TOUCH_TYPE == TOUCH_GT911)
	#include "gt911.h"
#endif

#if RTOS_TYPE

#include "OSAL.h"
/****************输入事件**********************/
extern OSAL_EVENT	g_inputEvent;
#if(RTOS_TYPE == ENABLE_AZURERTOS)

	#include "tx_api.h"
	
#elif(RTOS_TYPE == ENABLE_FREERTOS)
	#include "FreeRTOS.h"

#else

#endif
#endif

static TouchData	g_touchData;
static TouchInfo	g_touchInfo;

TouchDev	g_touchDev = {
	.info = &g_touchInfo,
	.init = TouchScreen_Init,
	.rest = TouchScreen_REST,
	.getData = Touch_GetData,
};

/*
*********************************************
*	功  能：触摸屏复位
*	形  参：无
*	返回值：无
*********************************************
*/
void TouchScreen_REST(void)
{
#if(TOUCH_TYPE == TOUCH_HY4633)
	HY4633_REST();
#elif(TOUCH_TYPE == TOUCH_FT5336)
	FT5336_Reset();
#elif(TOUCH_TYPE == TOUCH_GT911)
	GT911_REST();
#endif
}
/*
*********************************************
*	功  能：触摸屏初始化
*	形  参：无
*	返回值：无
*********************************************
*/
void TouchScreen_Init(void)
{
	Board_TouchPortInit();
	/**********复位*************/
	TouchScreen_REST();
	Touch_DataInit();
#if(TOUCH_TYPE == TOUCH_HY4633)
	HY4633_Init();
	g_touchInfo.TouchID = HY4633_ReadID();
	g_touchInfo.TouchVer = HY4633_ReadVersion();
#elif(TOUCH_TYPE == TOUCH_FT5336)
	FT5336_Init();
	g_touchInfo.TouchID = FT5336_ReadID();
	g_touchInfo.TouchVer = FT5336_ReadVersion();
#elif(TOUCH_TYPE == TOUCH_GT911)
	GT911_Init();
	g_touchInfo.TouchID = GT911_ReadID();
	g_touchInfo.TouchVer = GT911_ReadVersion();
#endif

}
/*
*********************************************
*	功  能：读取触摸坐标
*	形  参：无
*	返回值：无
*********************************************
*/
uint8_t TouchRead(void)
{
	Coord	coord;
	if(OS_RUNING())
	{
	#if(TOUCH_TYPE == TOUCH_HY4633)
		HY4633_Read(&coord);
	#elif(TOUCH_TYPE == TOUCH_FT5336)
		FT5336_Read(&coord);
	#elif(TOUCH_TYPE == TOUCH_GT911)
		GT911_Read(&coord);
	#endif
		Touch_InserData(coord);
		OSAL_EventSet(&g_inputEvent,OSAL_TOUCH,OSAL_OR); 
	}
	return OK;
}
/*
*********************************************
*	功  能：触摸屏中断,每40ms中断一次
*	形  参：GPIO_Pin：中断引脚
*	返回值：无
*********************************************
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//	SYS_ERR("TP_INT_PIN\r\n");
    if(GPIO_Pin == TP_INT_PIN)
    {
	#if RTOS_TYPE
		if(OS_RUNING())
	#endif
		TouchRead();
    }
}
/*
***************************************
*	功  能：初始化TP环形缓冲区
*	形  参：无
*	返回值：无
***************************************
*/
void Touch_DataInit(void)
{
	SysMemset(&g_touchData,0,sizeof(TouchData));
	if(Fifo_Init(&(g_touchData.fifo),Touch_MAX) != FifoOK)
	{
		SYS_ERR("FifoErr Size Illegal\r\n");
		ERROR_HANDLER();
	}
}
/*
***********************************************************
*	功  能：向缓冲中插入数据
*	输  入：_coord：插入的坐标数据
*	输	出：无
*	返回值：OK：成功	NOK：失败
***********************************************************
*/
uint8_t Touch_InserData(Coord _coord)
{
    uint32_t index = 0;
	Fifo_Put(&(g_touchData.fifo),&index);

	g_touchData.data[index].id = _coord.id;
    g_touchData.data[index].status = _coord.status;
	g_touchData.data[index].x = _coord.x;
	g_touchData.data[index].y = _coord.y;
	
    return OK;
}
/*
***********************************************************
*	功  能：向缓冲中插入数据
*	输  入：无
*	输	出：_coord：接收坐标数据
*	返回值：OK：成功	NOK：失败
***********************************************************
*/
uint8_t Touch_GetData(Coord *_coord)
{
	uint32_t index = 0,i;
	
	if(Fifo_Get(&(g_touchData.fifo),&index) == FifoErrIsEmpty)
    {
//        SYS_ERR("CirBuff IsEmpty\r\n");
        return NOK;
    }
	_coord->id = g_touchData.data[index].id;
    _coord->status = g_touchData.data[index].status;
	_coord->x = g_touchData.data[index].x;
	_coord->y = g_touchData.data[index].y;
	
    return OK;
}
#endif

